package com.gzyj.flink.utils;

import java.math.BigDecimal;

/**
 * @author lhj
 */
public class PointUtils {
    /**
     * 判断点是否在矩形
     *
     * @param lon
     * @param lat
     * @param areaLLon
     * @param areaLLat
     * @param areaSLon
     * @param areaSLat
     * @return
     */
    public static Boolean InRectangle(double lon, double lat, double areaLLon, double areaLLat, double areaSLon, double areaSLat) {
        Boolean flag = false;
        if (lon > areaSLon && lon < areaLLon && lat > areaSLat && lat < areaLLat) {
            flag = true;
        }
        return flag;
    }

    public static Double gps2double(Integer d) {
        return new BigDecimal((float) d / 1000000).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static Double gps2double(Long d) {
        return new BigDecimal((double) d / 1000000).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    // 判断点是否在多变型内
    public static Boolean InPolygoned(double lon, double lat, Double[] Arealons, Double[] Arealats) {
        Boolean result;
        try {
            int num = 0;
            int num2 = Arealons.length;
            for (int i = 0; i < num2; i++) {
                if (Arealats[i] != Arealats[(i + 1) % num2]) {
                    if (lat >= Math.min(Arealats[i], Arealats[(i + 1) % num2])) {
                        if (lat < Math.max(Arealats[i], Arealats[(i + 1) % num2])) {
                            double num3 = (lat - Arealats[i]) * (Arealons[(i + 1) % num2] - Arealons[i]) / (Arealats[(i + 1) % num2] - Arealats[i]) + Arealons[i];
                            if (num3 > lon) {
                                num++;
                            }
                        }
                    }
                }
            }
            result = (num % 2 == 1);
        } catch (Exception ex) {
            String err = ex.getMessage();
            result = false;
            ;
        }
        return result;
    }//func

    private final static double EarthRadius = 6378137;//单位：米

    //圆形
    public static Boolean InCircle(double lon, double lat, double arealon, double arealat, double radius) {
        Boolean bReturn = false;
        double radLatA = lat * Math.PI / 180.0;
        double radLatB = arealat * Math.PI / 180.0;
        double a = radLatA - radLatB;
        double b = lon * Math.PI / 180.0 - arealon * Math.PI / 180.0;
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatA) * Math.cos(radLatB) * Math.pow(Math.sin(b / 2), 2)));
        double distinct = s * EarthRadius;
        if (distinct < radius) {
            bReturn = true;
        }
        return bReturn;
    }//func

    private static final double EARTH_RADIUS = 6378.137; // 6378.137为地球半径(单位:千米)

    // Java 计算两个GPS坐标点之间的距离
    // lat1、lng1 表示A点经纬度，lat2、lng2 表示B点经纬度，计算出来的结果单位为千米
    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;      // a 是两坐标点的纬度之差
        double b = rad(lng1) - rad(lng2);  // b 是两坐标点的经度之差

        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
                Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
        s = s * EARTH_RADIUS;

        s = Math.round(s * 1000); // 转为米，用 Math.round() 取整
        s = s/1000; // 米转千米
        return s;
    }

    // 角度转弧度
    // 把用角度表示的角转换为近似相等的用弧度表示的角 Math.toRadians。
    // 经纬度是以度数（0-360）表示。如果要把度数转换为弧度（0-2π），要除以360再乘以2ππ（相当于，乘以π/ 180）。
    private static double rad(double d) {  return d * Math.PI / 180.0; }

}
